broadway: Don't fall back for translation transform nodes
authorAlexander Larsson <alexl@redhat.com>
Fri, 22 Mar 2019 09:02:18 +0000 (10:02 +0100)
committerAlexander Larsson <alexl@redhat.com>
Tue, 26 Mar 2019 16:07:47 +0000 (17:07 +0100)
These are trivial anyway

gdk/broadway/broadway-protocol.h
gdk/broadway/broadway.js
gdk/broadway/broadwayd.c
gsk/gskbroadwayrenderer.c

index 68911add812e41ba4376561239de18473e562003..b39719552124112b41793ddfd4718fbb7db8fd3e 100644 (file)
@@ -22,6 +22,7 @@ typedef enum { /* Sync changes with broadway.js */
   BROADWAY_NODE_CLIP = 10,
   BROADWAY_NODE_KEEP_ALL = 11,
   BROADWAY_NODE_KEEP_THIS = 12,
+  BROADWAY_NODE_TRANSLATE = 13,
 } BroadwayNodeType;
 
 static const char *broadway_node_type_names[] G_GNUC_UNUSED =  {
@@ -38,6 +39,7 @@ static const char *broadway_node_type_names[] G_GNUC_UNUSED =  {
   "CLIP",
   "KEEP_ALL",
   "KEEP_THIS",
+  "TRANSLATE",
 };
 
 typedef enum {
index 24859f1b15e3f79f6076d962d50e1f65234ad247..d7a6a0d44659a181c590fc12ec1aff5aa6eb484d 100644 (file)
@@ -400,6 +400,11 @@ function px(x) {
     return x + "px";
 }
 
+function set_point_style (div, point) {
+    div.style["left"] = px(point.x);
+    div.style["top"] = px(point.y);
+}
+
 function set_rect_style (div, rect) {
     div.style["left"] = px(rect.x);
     div.style["top"] = px(rect.y);
@@ -569,6 +574,17 @@ SwapNodes.prototype.insertNode = function(parent, posInParent, oldNode)
 
     /* Bin nodes */
 
+    case 13:  // TRANSLATE
+        {
+            var point = this.decode_point();
+            var div = document.createElement('div');
+            div.style["position"] = "absolute";
+            set_point_style(div, point);
+            this.insertNode(div, -1, oldChildren[0]);
+            newNode = div;
+        }
+        break;
+
     case 10:  // CLIP
         {
             var rect = this.decode_rect();
index e453af463c5967b9d7698c13e35a3a42383015e5..13d567563306793d22c58317e59ee66e41208a06 100644 (file)
@@ -277,6 +277,10 @@ decode_nodes (BroadwayClient *client,
     size = NODE_SIZE_RECT;
     n_children = 1;
     break;
+  case BROADWAY_NODE_TRANSLATE:
+    size = NODE_SIZE_POINT;
+    n_children = 1;
+    break;
   case BROADWAY_NODE_LINEAR_GRADIENT:
     size = NODE_SIZE_RECT + 2 * NODE_SIZE_POINT;
     n_stops = data[*pos + size++];
index 84b948d676e7c8b04ff5e2a7319214aae6b59bbf..c90ccbeab577ae24e53a945cb88b99030a6d25fc 100644 (file)
@@ -4,6 +4,7 @@
 #include "broadway/gdkprivate-broadway.h"
 
 #include "gskdebugprivate.h"
+#include "gsktransformprivate.h"
 #include "gskrendererprivate.h"
 #include "gskrendernodeprivate.h"
 #include "gdk/gdktextureprivate.h"
@@ -103,11 +104,17 @@ add_float (GArray *nodes, float f)
   g_array_append_val (nodes, u);
 }
 
+static void
+add_xy (GArray *nodes, float x, float y, float offset_x, float offset_y)
+{
+  add_float (nodes, x - offset_x);
+  add_float (nodes, y - offset_y);
+}
+
 static void
 add_point (GArray *nodes, const graphene_point_t *point, float offset_x, float offset_y)
 {
-  add_float (nodes, point->x - offset_x);
-  add_float (nodes, point->y - offset_y);
+  add_xy (nodes, point->x, point->y, offset_x, offset_y);
 }
 
 static void
@@ -633,6 +640,30 @@ gsk_broadway_renderer_add_node (GskRenderer *renderer,
       }
       return;
 
+    case GSK_TRANSFORM_NODE:
+      {
+        GskTransform *transform = gsk_transform_node_get_transform (node);
+        GskTransformCategory category = gsk_transform_get_category (transform);
+        float dx, dy;
+
+        if (category >= GSK_TRANSFORM_CATEGORY_2D_TRANSLATE)
+          {
+            gsk_transform_to_translate (transform, &dx, &dy);
+            add_uint32 (nodes, BROADWAY_NODE_TRANSLATE);
+            add_xy (nodes, dx, dy, offset_x, offset_y);
+            gsk_broadway_renderer_add_node (renderer, nodes, node_textures,
+                                            gsk_transform_node_get_child (node),
+                                            0, 0);
+          }
+        else
+          {
+            /* Fallback to texture for now */
+            break;
+          }
+
+      }
+      return;
+
       /* Generic nodes */
 
     case GSK_CONTAINER_NODE:
@@ -656,7 +687,6 @@ gsk_broadway_renderer_add_node (GskRenderer *renderer,
     case GSK_COLOR_MATRIX_NODE:
     case GSK_TEXT_NODE:
     case GSK_REPEATING_LINEAR_GRADIENT_NODE:
-    case GSK_TRANSFORM_NODE:
     case GSK_REPEAT_NODE:
     case GSK_BLEND_NODE:
     case GSK_CROSS_FADE_NODE: